import numpy as np

# 我自己的实现，只用了numpy库完成kNN算法
def kNN_classify2(k, X_train, y_train, a):
    assert 1 <= k <= X_train.shape[0], "k值必须大于等于0，并且小于等于训练样本个数"
    assert X_train.shape[0] == y_train.shape[0], "训练样本个数必须和类型数相等"
    assert X_train.shape[1] == a.shape[0], "待预测的样本特征数必须和训练样本的特征数相等"

    # 计算样本a到每一个训练样本的距离
    dis = [np.sqrt(np.sum((a - x) ** 2)) for x in X_train]
    distances = np.array(dis)

    # 找出离a最近的k个样本点的行索引
    nearestDisIndexes = distances.argsort()[:k]

    # 统计最近的k个样本中结果为0和1的个数
    # 统计训练样本类型中的所有的样本类型
    y_type = np.unique(y_train)
    # 统计每一种类型出现的次数
    counts = [np.sum(y_train[nearestDisIndexes] == i) for i in y_type]

    # 返回 距离样本a最近的 k个样本中 出现次数最多的类型 作为KNN算法预测的结果
    return y_type[np.argmax(counts)]